/*
 * Copyright 2006-2007 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package asphalt2.util
{
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	/**
	 * アプリケーショングローバルのイベントディスパッチャーです。
	 * addEventListenerでつけたリスナーはstatic領域にあるdispatcherにaddされるため、
	 * 弱参照を使用しないでaddしたリスナーはremoveしないと消えなくなります。
	 * @author c9katayama
	 **/
	public class ApplicationEventDispatcher
	{
		private static var dispatcher:EventDispatcher = new EventDispatcher();
		
		public static function getInstace():IEventDispatcher{
			return dispatcher;
		}		
		public static function dispatchEvent(e:Event):void{
			dispatcher.dispatchEvent(e);
		}
		public static function removeEventListener(type:String,listener:Function):void{
			dispatcher.removeEventListener(type,listener);			
		}
		public static function addEventListener(type:String,listener:Function,useCapture:Boolean=false,priority:int=0,useWeakreference:Boolean=false):void{
			dispatcher.addEventListener(type,listener,useCapture,priority,useWeakreference);
		}
		/**
		 * 第一引数のlifeCycleComponentがRemoveされた時に、一緒に消えるイベントリスナーを追加します。
		 */
		public static function addComponentLifeCycleEventListener(lifeCycleComponent:DisplayObject,type:String,listener:Function,useCapture:Boolean=false,priority:int=0,useWeakreference:Boolean=false):void{
			addEventListener(type,listener);
			UIUtil.callBackWhenComponentRemoved(lifeCycleComponent,function():void{
				ApplicationEventDispatcher.removeEventListener(type,listener);
			});
		}
		public static function addOnceEventListener(type:String,listener:Function):void{
			EventUtil.addOnceEventListener(dispatcher,type,listener);
		}
	}
}